/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.invoice.model.dao;

import com.invoice.busines.dto.ClienteDTO;
import com.invoice.busines.dto.ClienteCampoDTO;
import com.invoice.exceptions.InvoiceException;
import com.invoice.model.entities.Categoriacliente;
import com.invoice.model.entities.Clientes;
import com.invoice.model.entities.ClienteCampo;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Query;

/**
 *
 * @author Meli
 */
public class ClienteDAOHibernate extends  DAOGenerico implements ClienteDAO{
    Logger logger =Logger.getLogger(ClienteDAOHibernate.class.getName());
    @Override
    public Clientes convertDTOtoPojo(Object object) {
        if(object==null){
            return null;
        }
        ClienteDTO clienteDTO=(ClienteDTO)object;
        Clientes clientes=new Clientes();
        clientes.setActivo(clienteDTO.getActivo());
        clientes.setApeCli(clienteDTO.getApellido());
        
        Categoriacliente categoriacliente=new Categoriacliente(clienteDTO.getCategoriaCliente());
      //  clientes.setCategoriacliente(categoriacliente);
        clientes.setCelCli(clienteDTO.getCelular());
        clientes.setDirCli(clienteDTO.getDireccion());
        clientes.setEmaCli(clienteDTO.getEmail());
        clientes.setFecIng(clienteDTO.getFechaIngreso());
        clientes.setIdCli(clienteDTO.getIdCliente());
        clientes.setNomCli(clienteDTO.getNombre());
        clientes.setSexCli(clienteDTO.getSexo());
        clientes.setIdCliDes(clienteDTO.getIdClienteDes());
        clientes.setRuc(clienteDTO.getRuc());
        clientes.setTipo(clienteDTO.getTipo());
        if(clienteDTO.getClienteCampoDTOs() != null){
            ClienteCampo clienteCampo;
            for (ClienteCampoDTO clienteCampoDTO : clienteDTO.getClienteCampoDTOs()){
                clienteCampo = new ClienteCampo();
                clienteCampo.setIdClienteCampo(clienteCampoDTO.getIdClienteCampo());
                clienteCampo.setNameLabel(clienteCampoDTO.getNameLabel());
                clienteCampo.setValueLabel(clienteCampoDTO.getValueLabel());
                clientes.addClienteCampo(clienteCampo);
            }
        }
        return clientes;
    }

    @Override
    public ClienteDTO convertPojotoDTO(Object object) {
        if(object==null){
            return null;
        }
        Clientes clientes=(Clientes)object;
        ClienteDTO clienteDTO=new ClienteDTO();
        clienteDTO.setActivo(clientes.getActivo());
        clienteDTO.setApellido(clientes.getApeCli());
    //    clienteDTO.setCategoriaCliente(clientes.getCategoriacliente().getIdentificador());
        clienteDTO.setCelular(clientes.getCelCli());
        clienteDTO.setDireccion(clientes.getDirCli());
        clienteDTO.setEmail(clientes.getEmaCli());
        clienteDTO.setFechaIngreso(clientes.getFecIng());
        clienteDTO.setIdCliente(clientes.getIdCli());
        clienteDTO.setNombre(clientes.getNomCli());
        clienteDTO.setSexo(clientes.getSexCli());
        clienteDTO.setIdClienteDes(clientes.getIdCliDes());
       // clienteDTO.setTipo((clientes.getTipo().contentEquals("1"))?"Cliente":"Provee");
        clienteDTO.setTipo(clientes.getTipo());
        clienteDTO.setRuc(clientes.getRuc());
        if(clientes.getClienteCampos() != null){
            ClienteCampoDTO clienteCampoDTO;
            for (ClienteCampo clienteCampo : clientes.getClienteCampos()){
                clienteCampoDTO = new ClienteCampoDTO();
                clienteCampoDTO.setIdClienteCampo(clienteCampo.getIdClienteCampo());
                clienteCampoDTO.setNameLabel(clienteCampo.getNameLabel());
                clienteCampoDTO.setValueLabel(clienteCampo.getValueLabel());
                clienteDTO.addClienteCampoDTO(clienteCampoDTO);
            }
        }
        return clienteDTO;
    }

    @Override
    public ClienteDTO findCliente(String codigoCliente) throws InvoiceException {
        try {
            startSession();
            Query query=session.createQuery("from Clientes where idCliente=:cliente").setParameter("cliente", codigoCliente);
            Clientes clientes=(Clientes)query.uniqueResult();
            return convertPojotoDTO(clientes);
        } catch (Exception e) {
            rollback();
            logger.log(Level.SEVERE, e.getMessage(), e);
            return null;
        }finally{
            closeSession();
        }
    }
    
    
    @Override
    public List<ClienteDTO> findAll() throws InvoiceException {
        List<ClienteDTO> result = new ArrayList<ClienteDTO>();
        try {
            startSession();
            Query query=session.createQuery("from Clientes");
            List<Clientes> list = (ArrayList<Clientes>)query.list();
         
            for (Clientes clienteO : list) {
                ClienteDTO clienteDTO = convertPojotoDTO(clienteO);
                result.add(clienteDTO);
            }
            transaction.commit();
            return result;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }

   
    

    
    
}
